/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.entities;

import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;

/**
 * Questa classe rappresenta l'entità Cliente, inteso sia come cliente che come venditore.
 * 
 * @author fe
 */
@Entity
public class Cliente implements Serializable {
    private static final long serialVersionUID = 1L;
    
    /* CAMPI DI CLIENTE */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long idCliente;   
    
    @Column(nullable=false)
    private String nome;

    @Column(nullable=false)
    private String cognome;

    @Column(nullable=false)    
    private String cf;

    @Column(nullable=false)
    private String email;

    @Column(nullable=false)    
    private String password;

    @Column(nullable=false)    
    private short tipo;

    @Column(nullable=false)    
    private Indirizzo indirizzo;

    private String telefono;
    
    private String urlimmagine;
    
    @Column(nullable=false)    
    @Temporal(javax.persistence.TemporalType.DATE)
    private Calendar datan;

    
    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "cliente")
    private List<Prenotazione> prenotazioniEffettuate;

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "proprietario")
    private List<Locale> localiPosseduti;



    /* COSTRUTTORI */
    /**
     * Crea una nuova istanza di Cliente.
     */
    public Cliente() {}
    
    
    
    /* GETTER AND SETTER */

    /**
     * @return restituisce il codice fiscale del cliente.
     */
    public String getCf() {
        return cf;
    }

    /**
     * Imposta il codice fiscale del cliente.
     * 
     * @param cf codice fiscale
     */
    public void setCf(String cf) {
        this.cf = cf;
    }

    /**
     * @return restituisce il cognome
     */
    public String getCognome() {
        return cognome;
    }

    /**
     * Imposta il cognome del cliente.
     * 
     * @param cognome 
     */
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    /**
     * @return data di nascita del cliente
     * @see Calendar
     */
    public Calendar getData_nascita() {
        return datan;
    }

    /**
     * Imposta la data di nascita.
     * 
     * @param datan data di nascita
     * @see Calendar
     */
    public void setData_nascita(Calendar datan) {        
        this.datan = datan;
    }

    /**
     * @return indirizzo email
     */
    public String getEmail() {
        return email;
    }

    /**
     * Imposta l'indirizzo email.
     * 
     * @param email 
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return ID del cliente
     */
    public long getIdCliente() {
        return idCliente;
    }

    /**
     * Imposta l'ID del cliente.
     * 
     * @param idCliente 
     */
    public void setIdCliente(long idCliente) {
        this.idCliente = idCliente;
    }

    /**
     * @return indirizzo del cliente
     * @see Indirizzo
     */
    public Indirizzo getIndirizzo() {
        return indirizzo;
    }

    /**
     * Imposta l'indirizzo.
     * 
     * @param indirizzo 
     */
    public void setIndirizzo(Indirizzo indirizzo) {
        this.indirizzo = indirizzo;
    }

    /**
     * @return lista dei locali posseduti dal cliente. Se il cliente non e' registrato come venditore
     * la lista e' sempre vuota
     * @see Locale
     */
    public List<Locale> getLocaliPosseduti() {
        return localiPosseduti;
    }

    /**
     * Questo metodo non deve essere usato, serve solo per creare l'entità persistente!!
     * 
     * @deprecated 
     */
    public void setLocaliPosseduti(List<Locale> localiPosseduti) {
        this.localiPosseduti = localiPosseduti;
    }

    /**
     * @return nome del cliente
     */
    public String getNome() {
        return nome;
    }

    /**
     * Imposta il nome del cliente.
     * 
     * @param nome 
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return hash a 32 bit della password
     */
    public String getPassword() {
        return password;
    }

    /**
     * Imposta la password.
     * 
     * @param password 
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return lista delle prenotazioni effettuate dal cliente. Se il cliente e' registrato come venditore
     * la lista e' sempre vuota
     * @see Prenotazione
     */
    public List<Prenotazione> getPrenotazioniEffettuate() {
        return prenotazioniEffettuate;
    }

    /**
     * Questo metodo non deve essere usato, serve solo per creare l'entità persistente!!
     * 
     * @deprecated 
     */
    public void setPrenotazioniEffettuate(List<Prenotazione> prenotazioniEffettuate) {
        this.prenotazioniEffettuate = prenotazioniEffettuate;
    }

    /**
     * @return telefono
     */
    public String getTelefono() {
        return telefono;
    }

    /**
     * Imposta il telefono.
     * 
     * @param telefono 
     */
    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    /**
     * @return intero che rappresenta il tipo del cliente. 
     * <ul>
     * <li>0 --> cliente</li>
     * <li>1 --> venditore</li>
     * </ul>
     */
    public short getTipo() {
        return tipo;
    }

    /**
     * Imposta il tipo di cliente.
     * 
     * @param tipo intero che rappresenta il tipo del cliente. 
     * <ul>
     * <li>0 --> cliente</li>
     * <li>1 --> venditore</li>
     * </ul>

     */
    public void setTipo(short tipo) {
        this.tipo = tipo;
    }
    
    /**
     * @return url dell'immagine del cliente
     */
    public String getUrlimmagine() {
        return urlimmagine;
    }

    /**
     * Imposta l'url dell'immagine del cliente.
     * 
     * @param urlimmagine 
     */
    public void setUrlimmagine(String urlimmagine) {
        this.urlimmagine = urlimmagine;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }
    
    
   
    /* EQUALS AND HASHCODE */

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Cliente other = (Cliente) obj;
        if (this.idCliente != other.idCliente) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + (int) (this.idCliente ^ (this.idCliente >>> 32));
        return hash;
    }
    
    
    
    
    
    /* METODI TOSTRING */

    @Override
    public String toString() {
        return "Cliente{" + "idCliente=" + idCliente + ", nome=" + nome + ", cognome=" + cognome + ", cf=" + cf + ", email=" + email + ", password=" + password + ", tipo=" + tipo + ", indirizzo=" + indirizzo + ", telefono=" + telefono + ", urlimmagine=" + urlimmagine + ", datan=" + datan + ", prenotazioniEffettuate=" + prenotazioniEffettuate + ", localiPosseduti=" + localiPosseduti + '}';
    }
    
}
